return 0;
}
-
#define GTK_CLIST_CLASS_FW(_widget_) GTK_CLIST_CLASS (GTK_OBJECT (_widget_)->klass)
static void column_button_clicked (GtkWidget *widget,
gpointer data);
-/* Scrollbars */
-static void adjust_adjustments (GtkCList *clist);
+/* Adjustments */
+static void adjust_adjustments (GtkCList *clist,
+ gboolean block_resize);
static void check_exposures (GtkCList *clist);
static void vadjustment_changed (GtkAdjustment *adjustment,
gpointer data);
static void draw_rows (GtkCList *clist,
GdkRectangle *area);
-/* Size Allocation */
+/* Size Allocation / Requisition */
static void size_allocate_title_buttons (GtkCList *clist);
static void size_allocate_columns (GtkCList *clist);
+static gint list_requisition_width (GtkCList *clist);
/* Memory Allocation/Distruction Routines */
static GtkCListColumn *columns_new (GtkCList *clist);
gtk_clist_set_hadjustment (GtkCList *clist,
GtkAdjustment *adjustment)
{
+ GtkAdjustment *old_adjustment;
+
g_return_if_fail (clist != NULL);
g_return_if_fail (GTK_IS_CLIST (clist));
if (adjustment)
g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
- if (clist->hadjustment && (clist->hadjustment != adjustment))
+ if (clist->hadjustment == adjustment)
+ return;
+
+ old_adjustment = clist->hadjustment;
+
+ if (clist->hadjustment)
{
gtk_signal_disconnect_by_data (GTK_OBJECT (clist->hadjustment), clist);
gtk_object_unref (GTK_OBJECT (clist->hadjustment));
}
- if (!adjustment)
- adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0,
- 0.0, 0.0, 0.0));
+ clist->hadjustment = adjustment;
- if (clist->hadjustment != adjustment)
+ if (clist->hadjustment)
{
- clist->hadjustment = adjustment;
gtk_object_ref (GTK_OBJECT (clist->hadjustment));
gtk_object_sink (GTK_OBJECT (clist->hadjustment));
(GtkSignalFunc) hadjustment_value_changed,
(gpointer) clist);
}
+
+ if (!clist->hadjustment || !old_adjustment)
+ gtk_widget_queue_resize (GTK_WIDGET (clist));
}
GtkAdjustment *
gtk_clist_set_vadjustment (GtkCList *clist,
GtkAdjustment *adjustment)
{
+ GtkAdjustment *old_adjustment;
+
g_return_if_fail (clist != NULL);
g_return_if_fail (GTK_IS_CLIST (clist));
if (adjustment)
g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
+
+ if (clist->vadjustment == adjustment)
+ return;
- if (clist->vadjustment && (clist->vadjustment != adjustment))
+ old_adjustment = clist->vadjustment;
+
+ if (clist->vadjustment)
{
gtk_signal_disconnect_by_data (GTK_OBJECT (clist->vadjustment), clist);
gtk_object_unref (GTK_OBJECT (clist->vadjustment));
}
- if (!adjustment)
- adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0,
- 0.0, 0.0, 0.0));
+ clist->vadjustment = adjustment;
- if (clist->vadjustment != adjustment)
+ if (clist->vadjustment)
{
- clist->vadjustment = adjustment;
gtk_object_ref (GTK_OBJECT (clist->vadjustment));
gtk_object_sink (GTK_OBJECT (clist->vadjustment));
(GtkSignalFunc) vadjustment_value_changed,
(gpointer) clist);
}
+
+ if (!clist->vadjustment || !old_adjustment)
+ gtk_widget_queue_resize (GTK_WIDGET (clist));
}
GtkAdjustment *
g_return_if_fail (GTK_IS_CLIST (clist));
GTK_CLIST_UNSET_FLAG (clist, CLIST_FROZEN);
-
- adjust_adjustments (clist);
+ adjust_adjustments (clist, FALSE);
draw_rows (clist, NULL);
}
/* remove and destroy the old widget */
old_widget = GTK_BIN (clist->column[column].button)->child;
if (old_widget)
- gtk_container_remove (GTK_CONTAINER (clist->column[column].button), old_widget);
+ gtk_container_remove (GTK_CONTAINER (clist->column[column].button),
+ old_widget);
/* add and show the widget */
if (widget)
* abort_column_resize
* size_allocate_title_buttons
* size_allocate_columns
+ * list_requisition_width
* new_column_width
* column_button_create
* column_button_clicked
if (column < 0 || column >= clist->columns)
return;
-
+
if (width < MAX (COLUMN_MIN_WIDTH, clist->column[column].min_width))
width = MAX (COLUMN_MIN_WIDTH, clist->column[column].min_width);
if (clist->column[column].max_width >= 0 &&
if (!GTK_CLIST_FROZEN (clist))
{
- adjust_adjustments (clist);
+ adjust_adjustments (clist, FALSE);
draw_rows (clist, NULL);
}
}
{
gint xoffset = CELL_SPACING + COLUMN_INSET;
gint last_column;
- gint width = 0;
gint i;
/* find last visible column and calculate correct column width */
if (last_column < 0)
return;
- for (i = 0; i < last_column; i++)
+ for (i = 0; i <= last_column; i++)
{
if (!clist->column[i].visible)
continue;
clist->column[i].area.x = xoffset;
- clist->column[i].area.width = clist->column[i].width;
- xoffset += clist->column[i].width + CELL_SPACING + (2 * COLUMN_INSET);
+ if (clist->column[i].width_set)
+ {
+ clist->column[i].area.width = clist->column[i].width;
+ xoffset += clist->column[i].width + CELL_SPACING + (2* COLUMN_INSET);
+ }
+ else if (GTK_CLIST_SHOW_TITLES (clist) && clist->column[i].button)
+ {
+ clist->column[i].area.width =
+ clist->column[i].button->requisition.width -
+ (CELL_SPACING + (2 * COLUMN_INSET));
+ xoffset += clist->column[i].button->requisition.width;
+ }
}
- if (clist->column[i].width_set)
- width = clist->column[i].width;
- else if (clist->column[i].title)
- width = gdk_string_width (GTK_WIDGET (clist)->style->font,
- clist->column[i].title);
+ clist->column[last_column].area.width = clist->column[last_column].area.width
+ + MAX (0, clist->clist_window_width + COLUMN_INSET - xoffset);
+}
+
+static gint
+list_requisition_width (GtkCList *clist)
+{
+ gint width = CELL_SPACING;
+ gint i;
+
+ for (i = clist->columns - 1; i >= 0 && !clist->column[i].visible; i--)
+ ;
+
+ for (; i >= 0; i--)
+ {
+ if (!clist->column[i].visible)
+ continue;
+
+ if (clist->column[i].width_set)
+ width += clist->column[i].width + CELL_SPACING + (2 * COLUMN_INSET);
+ else if (GTK_CLIST_SHOW_TITLES (clist) && clist->column[i].button)
+ width += clist->column[i].button->requisition.width;
+ }
- clist->column[i].area.x = xoffset;
- clist->column[i].area.width = MAX (width,
- clist->clist_window_width - xoffset -
- (CELL_SPACING + COLUMN_INSET));
+ return width;
}
/* this function returns the new width of the column being resized given
GtkWidget *button;
button = clist->column[column].button = gtk_button_new ();
+
if (GTK_WIDGET_REALIZED (clist) && clist->title_window)
- gtk_widget_set_parent_window (clist->column[column].button, clist->title_window);
+ gtk_widget_set_parent_window (clist->column[column].button,
+ clist->title_window);
gtk_widget_set_parent (button, GTK_WIDGET (clist));
-
+
gtk_signal_connect (GTK_OBJECT (button), "clicked",
(GtkSignalFunc) column_button_clicked,
(gpointer) clist);
if (!GTK_CLIST_FROZEN (clist))
{
- adjust_adjustments (clist);
+ adjust_adjustments (clist, FALSE);
draw_rows (clist, NULL);
}
}
return;
if (column < -1 || column >= clist->columns)
return;
- if (!clist->hadjustment || !clist->vadjustment)
- return;
row_align = CLAMP (row_align, 0, 1);
col_align = CLAMP (col_align, 0, 1);
/* adjust horizontal scrollbar */
- if (column >= 0)
+ if (clist->hadjustment && column >= 0)
{
gint x;
}
/* adjust vertical scrollbar */
- if (row >= 0)
+ if (clist->vadjustment && row >= 0)
move_vertical (clist, row, row_align);
}
/* redraw the list if it isn't frozen */
if (!GTK_CLIST_FROZEN (clist))
{
- adjust_adjustments (clist);
+ adjust_adjustments (clist, FALSE);
if (gtk_clist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE)
draw_rows (clist, NULL);
/* redraw the row if it isn't frozen */
if (!GTK_CLIST_FROZEN (clist))
{
- adjust_adjustments (clist);
+ adjust_adjustments (clist, FALSE);
if (was_visible)
draw_rows (clist, NULL);
if (!GTK_CLIST_FROZEN (clist))
gtk_clist_thaw (clist);
}
+ else
+ gtk_widget_queue_resize (GTK_WIDGET (clist));
}
/* PUBLIC ROW FUNCTIONS
clist = GTK_CLIST (widget);
/* create adjustments */
- if (!clist->hadjustment)
+ /* if (!clist->hadjustment)
gtk_clist_set_hadjustment (clist, NULL);
if (!clist->vadjustment)
- gtk_clist_set_vadjustment (clist, NULL);
+ gtk_clist_set_vadjustment (clist, NULL);*/
}
static gint
{
gfloat value;
+ if (!clist->vadjustment)
+ return;
+
value = (ROW_TOP_YPIXEL (clist, row) - clist->voffset -
align * (clist->clist_window_height - clist->row_height) +
(2 * align - 1) * CELL_SPACING);
{
gfloat value;
+ if (!clist->hadjustment)
+ return;
+
value = CLAMP (clist->hadjustment->value + diff, 0.0,
clist->hadjustment->upper - clist->hadjustment->page_size);
gtk_adjustment_set_value(clist->hadjustment, value);
gdk_window_get_pointer (clist->clist_window, &x, &y, NULL);
/* horizontal autoscrolling */
- if (LIST_WIDTH (clist) > clist->clist_window_width &&
+ if (clist->hadjustment && LIST_WIDTH (clist) > clist->clist_window_width &&
(x < 0 || x >= clist->clist_window_width))
{
if (clist->htimer)
row = ROW_FROM_YPIXEL (clist, y);
/* don't scroll on last pixel row if it's a cell spacing */
- if (y == clist->clist_window_height-1 &&
+ if (y == clist->clist_window_height - 1 &&
y == ROW_TOP_YPIXEL (clist, row-1) + clist->row_height)
return FALSE;
gtk_clist_size_request (GtkWidget *widget,
GtkRequisition *requisition)
{
- gint i;
GtkCList *clist;
+ gint i;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_CLIST (widget));
requisition->height += (clist->column_title_area.height +
(widget->style->klass->ythickness +
GTK_CONTAINER (widget)->border_width) * 2);
+
+ if (!clist->hadjustment)
+ requisition->width += list_requisition_width (clist);
+ if (!clist->vadjustment)
+ requisition->height += LIST_HEIGHT (clist);
}
static void
size_allocate_columns (clist);
size_allocate_title_buttons (clist);
- adjust_adjustments (clist);
+ adjust_adjustments (clist, TRUE);
}
/* GTKCONTAINER
* check_exposures
*/
static void
-adjust_adjustments (GtkCList * clist)
+adjust_adjustments (GtkCList *clist,
+ gboolean block_resize)
{
- if (!clist->hadjustment || !clist->vadjustment)
- return;
+ if (clist->vadjustment)
+ {
+ clist->vadjustment->page_size = clist->clist_window_height;
+ clist->vadjustment->page_increment = clist->clist_window_height / 2;
+ clist->vadjustment->step_increment = clist->row_height;
+ clist->vadjustment->lower = 0;
+ clist->vadjustment->upper = LIST_HEIGHT (clist);
- clist->vadjustment->page_size = clist->clist_window_height;
- clist->vadjustment->page_increment = clist->clist_window_height / 2;
- clist->vadjustment->step_increment = 10;
- clist->vadjustment->lower = 0;
- clist->vadjustment->upper = LIST_HEIGHT (clist);
+ if (clist->clist_window_height - clist->voffset > LIST_HEIGHT (clist))
+ {
+ clist->vadjustment->value = MAX (0, (LIST_HEIGHT (clist) -
+ clist->clist_window_height));
+ gtk_signal_emit_by_name (GTK_OBJECT (clist->vadjustment),
+ "value_changed");
+ }
+ gtk_signal_emit_by_name (GTK_OBJECT (clist->vadjustment), "changed");
+ }
- if (clist->clist_window_height - clist->voffset > LIST_HEIGHT (clist))
+ if (clist->hadjustment)
{
- clist->vadjustment->value = MAX (0, (LIST_HEIGHT (clist) -
- clist->clist_window_height));
- gtk_signal_emit_by_name (GTK_OBJECT (clist->vadjustment),
- "value_changed");
- }
+ clist->hadjustment->page_size = clist->clist_window_width;
+ clist->hadjustment->page_increment = clist->clist_window_width / 2;
+ clist->hadjustment->step_increment = 10;
+ clist->hadjustment->lower = 0;
+ clist->hadjustment->upper = LIST_WIDTH (clist);
- clist->hadjustment->page_size = clist->clist_window_width;
- clist->hadjustment->page_increment = clist->clist_window_width / 2;
- clist->hadjustment->step_increment = 10;
- clist->hadjustment->lower = 0;
- clist->hadjustment->upper = LIST_WIDTH (clist);
+ if (clist->clist_window_width - clist->hoffset > LIST_WIDTH (clist))
+ {
+ clist->hadjustment->value = MAX (0, (LIST_WIDTH (clist) -
+ clist->clist_window_width));
+ gtk_signal_emit_by_name (GTK_OBJECT (clist->hadjustment),
+ "value_changed");
+ }
+ gtk_signal_emit_by_name (GTK_OBJECT (clist->hadjustment), "changed");
+ }
- if (clist->clist_window_width - clist->hoffset > LIST_WIDTH (clist))
+ if (!block_resize && (!clist->vadjustment || !clist->hadjustment))
{
- clist->hadjustment->value = MAX (0, (LIST_WIDTH (clist) -
- clist->clist_window_width));
- gtk_signal_emit_by_name (GTK_OBJECT (clist->hadjustment),
- "value_changed");
- }
+ GtkWidget *widget;
- gtk_signal_emit_by_name (GTK_OBJECT (clist->vadjustment), "changed");
- gtk_signal_emit_by_name (GTK_OBJECT (clist->hadjustment), "changed");
+ widget = GTK_WIDGET (clist);
+ gtk_widget_size_request (widget, &widget->requisition);
+
+ if ((!clist->hadjustment &&
+ widget->requisition.width != widget->allocation.width) ||
+ (!clist->vadjustment &&
+ widget->requisition.height != widget->allocation.height))
+ gtk_widget_queue_resize (widget);
+ }
}
static void